#ifndef __DRV_RF24L01_H__
#define __DRV_RF24L01_H__

#include "spi.h"
#include "tools.h"

/** 配置和选项定义 */
#define PIPE0_PACKET_LEN            0
#define PIPE1_PACKET_LEN            0
#define PIPE2_PACKET_LEN            0
#define PIPE3_PACKET_LEN            0
#define PIPE4_PACKET_LEN            0
#define PIPE5_PACKET_LEN            0
#define INIT_ADDR_PIPE0             0xFE, 0xDC, 0xBA, 0x98, 0xC0
#define INIT_ADDR_PIPE1             0xFE, 0xDC, 0xBA, 0x98, 0xC1
#define INIT_ADDR_PIPE2                                     0xC2
#define INIT_ADDR_PIPE3                                     0xC3
#define INIT_ADDR_PIPE4                                     0xC4
#define INIT_ADDR_PIPE5                                     0xC5
#define INIT_ADDR_TXADDR            0xFE, 0xDC, 0xBA, 0x98, 0xC0
#define RETRY_TIMES                 15
#define WAIT_TIME_X_250US           3


/*类型定义*/
typedef enum
{
    MODE_RX = 0,
    MODE_TX = 1
} nRf24l01ModeType;

/** 口线操作函数定义 */
#define RF24L01_SET_CE_HIGH              PAout(2) = 1
#define RF24L01_SET_CE_LOW               PAout(2) = 0

#define RF24L01_SET_CS_HIGH              PAout(3) = 1
#define RF24L01_SET_CS_LOW               PAout(3) = 0

//命令
#define NRF_READ_REG             0x00    //读配置寄存器，低5位为寄存器地址
#define NRF_WRITE_REG            0x20    //写配置寄存器，低5位为寄存器地址
#define RD_RX_PLOAD              0x61    //读RX有效数据，1~32字节
#define WR_TX_PLOAD              0xA0    //写TX有效数据，1~32字节
#define FLUSH_TX                 0xE1    //清除TX FIFO寄存器，发射模式下使用
#define FLUSH_RX                 0xE2    //清除RX FIFO寄存器，接收模式下使用
#define REUSE_TX_PL              0xE3    //重新使用上一包数据，CE为高，数据包被不断发送
#define R_RX_PL_WID              0x60    //RX中数据宽度
#define NOP                      0xFF    //空操作，可以用来读状态寄存器
#define W_ACK_PLOAD              0xA8    //ACK的载荷
#define WR_TX_PLOAD_NACK         0xB0    //不要返回ACK的载荷

//寄存器地址
//中断屏蔽, CRC,CRC长度, 开电源, 接收
#define CONFIG                   0x00
#define     MASK_RX_DR           (0x01<<6)
#define     MASK_TX_DS           (0x01<<5)
#define     MASK_MAX_RT          (0x01<<4)
#define     EN_CRC               (0x01<<3)
#define     CRC_1BYTE            (0x00<<2)
#define     CRC_2BYTE            (0x01<<2)
#define     PWR_UP               (0x01<<1)
#define     PRIM_RX              (0x01<<0)

//使能自动应答功能 bit0~5 对应通道0~5
#define EN_AA                    0x01
#define     ENAA_NO_PIPE         0x00
#define     ENAA_P5              0x20
#define     ENAA_P4              0x10
#define     ENAA_P3              0x08
#define     ENAA_P2              0x04
#define     ENAA_P1              0x02
#define     ENAA_P0              0x01

//使能哪一通道接收,接收地址允许 bit0~5 对应通道0~5
#define EN_RXADDR                0x02
#define     ERX_NO_PIPE          0x00
#define     ERX_P5               0x20
#define     ERX_P4               0x10
#define     ERX_P3               0x08
#define     ERX_P2               0x04
#define     ERX_P1               0x02
#define     ERX_P0               0x01

//设置地址宽度(所有数据通道) bit0~1: 00,3字节 01,4字节, 02,5字节
#define SETUP_AW                 0x03
#define     AW_3BYTES            0x01
#define     AW_4BYTES            0x02
#define     AW_5BYTES            0x03

//建立自动重发;bit0~3:自动重发计数器;bit4~7:自动重发延时 250*x+86us
#define SETUP_RETR               0x04
#define     ARD_250US(n)         ((0x01*n)<<4)
#define     ARC_DISABLE          0x00
#define     ARC_1TIMES(n)        (0x01*n)

//RF通道,bit0~6工作通道频率
#define RF_CH                    0x05

//RF寄存器，bit3:传输速率( 0:1M 1:2M);bit1~2:发射功率;bit0:噪声放大器增益
#define RF_SETUP                 0x06
#define     CONT_WAVE            0x80
#define     RF_DR_LOW_250K       0x20
#define     RF_DR_HIGH_1M        0x00
#define     RF_DR_HIGH_2M        0x08
#define     PWR_F18DB            0x00
#define     PWR_F12DB            0x02
#define     PWR_F6DB             0x04
#define     PWR_0DB              0x06

//状态寄存器
#define STATUS                   0x07
#define     RX_DR                0x40
#define     TX_DS                0x20
#define     MAX_RT               0x10
#define     IRQ_ALL              (RX_DR|TX_DS|MAX_RT)
#define     RX_P_NO              0x0E    //1:4三位代表Pipe No, 111 表示接收缓冲区为空
#define         RX_EMPTY_BITS    0x0E
#define     TX_FULL_BIT          0x01

//发送检测寄存器,bit7~4:数据包丢失计数器;bit3~0:重发计数器
#define OBSERVE_TX               0x08
#define     PLOS_CNT             0xF0    //高四位,发送丢包数目
#define     ARC_CNT              0x0F    //重传次数

//载波检测寄存器,bit0:载波检测
#define RPD                      0x09

//各通道接收地址
#define RX_ADDR_P0               0x0A    //数据通道0接收地址，最大长度5个字节，低字节在前
#define RX_ADDR_P1               0x0B    //数据通道1接收地址，最大长度5个字节，低字节在前
#define RX_ADDR_P2               0x0C    //数据通道2接收地址，最低字节可设置，高字节,同RX_ADDR_P1[39:8]相等
#define RX_ADDR_P3               0x0D    //数据通道3接收地址，最低字节可设置，高字节,同RX_ADDR_P1[39:8]相等
#define RX_ADDR_P4               0x0E    //数据通道4接收地址，最低字节可设置，高字节,同RX_ADDR_P1[39:8]相等
#define RX_ADDR_P5               0x0F    //数据通道5接收地址，最低字节可设置，高字节,同RX_ADDR_P1[39:8]相等
#define TX_ADDR                  0x10    //发送地址(低字节在前),ShockBurstTM模式下，RX_ADDR_P0与地址相等

//各通道数据宽度
#define RX_PW_P0                 0x11    //接收数据通道0有效数据宽度(1~32字节),设置为0则非法
#define RX_PW_P1                 0x12    //接收数据通道1有效数据宽度(1~32字节),设置为0则非法
#define RX_PW_P2                 0x13    //接收数据通道2有效数据宽度(1~32字节),设置为0则非法
#define RX_PW_P3                 0x14    //接收数据通道3有效数据宽度(1~32字节),设置为0则非法
#define RX_PW_P4                 0x15    //接收数据通道4有效数据宽度(1~32字节),设置为0则非法
#define RX_PW_P5                 0x16    //接收数据通道5有效数据宽度(1~32字节),设置为0则非法

//FIFO状态寄存器
#define FIFO_STATUS              0x17
#define     TX_REUSE             (0x01<<6)
#define     TX_FULL_FIFO_STATUS  (0x01<<5)
#define     TX_EMPTY             (0x01<<4)
#define     RX_FULL              (0x01<<1)
#define     RX_EMPTY_FIFO_STATUS (0x01<<0)

//各通动态载荷使能
#define DYNPD                    0x1C
#define     DPL_NO_PIPE          (0x00<<0)
#define     DPL_P5               (0x01<<5)
#define     DPL_P4               (0x01<<4)
#define     DPL_P3               (0x01<<3)
#define     DPL_P2               (0x01<<2)
#define     DPL_P1               (0x01<<1)
#define     DPL_P0               (0x01<<0)

//功能开启
#define FEATRUE                   0x1D
#define     FEATURE_ALL_DISABLE   0x00
#define     EN_DPL                0x04
#define     EN_ACK_PAY            0x02
#define     EN_DYN_ACK            0x01

//NRF24L01控制
void NRF24L01_PowerUp( void );
void NRF24L01_PowerDown( void );
void NRF24L01_Trig_Tx( void );
void NRF24L01_Set_Mode( nRf24l01ModeType Mode );
void NRF24L01_Set_ReTransmission( unsigned char DelayTimesOf250us, unsigned char RetransmitCount);
void NRF24L01_Set_TxAddr( uint8_t *pAddr, uint8_t len );
void NRF24L01_Set_RxAddr( uint8_t PipeNum, uint8_t *pAddr, uint8_t Len );
void NRF24L01_Set_Speed( uint8_t speed );
void NRF24L01_Set_Power( uint8_t power );
void RF24LL01_Set_FreqPoint( uint8_t FreqPoint );
void NRF24L01_Flush_Tx_Fifo ( void );
void NRF24L01_Flush_Rx_Fifo( void );
void NRF24L01_Reuse_Tx_Payload( void );
uint8_t NRF24L01_Read_Status_Register( void );
uint8_t NRF24L01_Clear_IRQ_Flag( uint8_t IRQ_Source );
uint8_t NRF24L01_Read_IRQ_Status( uint8_t IRQ_Source );
uint8_t NRF24L01_Read_ReTransmission_Count( void );
uint8_t NRF24L01_Read_LostPackets_Count( void );
uint8_t NRF24L01_Read_Top_Fifo_Width( void );

//载荷写入
void NRF24L01_Write_Tx_Payload_Ack( uint8_t *pTxBuf, uint8_t len );
void NRF24L01_Write_Tx_Payload_NoAck( uint8_t *pTxBuf, uint8_t len );
void NRF24L01_Write_Tx_Payload_InAck( uint8_t *pData, uint8_t len );

//基础传输
uint8_t NRF24L01_Read_Reg( uint8_t RegAddr );
void NRF24L01_Read_Buf( uint8_t RegAddr, uint8_t *pBuf, uint8_t len );
void NRF24L01_Write_Cmd(uint8_t cmd);
void NRF24L01_Write_Reg( uint8_t RegAddr, uint8_t Value );
void NRF24L01_Write_Buf( uint8_t RegAddr, uint8_t *pBuf, uint8_t len );

//安装始化
void NRF24L01_Init( void );

//检查NRF24L01是否存在
unsigned char NRF24L01_check( void );

//导出变量
extern const unsigned char InitAddr[3][6];
extern const unsigned char InitRegMap[25][2];
#endif

